/**
 * 
 */
package com.bar.carta.bean;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;

import com.bar.carta.model.LanguageEnum;
import com.bar.carta.model.Plato;
import com.bar.carta.model.PlatoDTO;
import com.bar.carta.model.Tipo;
import com.bar.carta.model.TipoDTO;
import com.bar.carta.service.PlatoLocalServiceUtil;
import com.bar.carta.service.TipoLocalServiceUtil;
import com.icesoft.faces.component.ext.RowSelector;
import com.icesoft.faces.component.ext.RowSelectorEvent;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.Image;
import com.liferay.portal.model.Role;
import com.liferay.portal.service.ImageLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;

/**
 * @author pgonzalm
 *
 */
@ManagedBean (name = CartaBean.NAME_BEAN)
@ViewScoped
public class CartaBean implements Serializable {
	
	/**
	 * Log para los errores.
	 */
	private static final Log _log = LogFactoryUtil.getLog(CartaBean.class);
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	public static final String NAME_BEAN = "cartaBean";
	
	private List<PlatoDTO> platos;
	
	private List<TipoDTO> tipos;
	
	private ThemeDisplay theme;
	
	private String pathImage;
	
	private String url;
	
	private boolean badministrador;
	
	/**
	 * Fila que hemos seleccionado.
	 */
	private Integer filaSeleccionada;
	
	private int idioma;

	public CartaBean(){
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		//Inicializamos el themeDisplay.
		theme = (ThemeDisplay)facesContext.getExternalContext().getRequestMap().get(WebKeys.THEME_DISPLAY);
		
		url = PropsUtil.get(PropsKeys.AUTO_DEPLOY_TOMCAT_DEST_DIR) + theme.getPathThemeImages() + "/temp";
		//Creamos el directorio temporal.
		File directorioTemp = new File(url);
		directorioTemp.mkdir();
		url += "/";
		pathImage = theme.getPathThemeImages() + "/temp/";
		
		try {
			for (Role rol : theme.getUser().getRoles()){
				if (rol.getName().equals("Administrator")){
					badministrador = true;
				}
			}
		} catch (SystemException e) {
			_log.error("No encuentra roles de usuario.");
		}
		
		idioma = LanguageEnum.getIdentifierByName(theme.getLocale().getLanguage());
		
		tipos = new ArrayList<TipoDTO>();
		List<Tipo> tiposAux = TipoLocalServiceUtil.selectTipos();
		for (Tipo tipoAux : tiposAux){
			TipoDTO tipo = (TipoDTO)tipoAux;
			tipo.setLanguage(idioma);
			tipos.add(tipo);
		}
		
	}
	
	public String addTipo(){
		return "/xhtml/editTipo.xhtml";
	}
	
	public String editTipo(TipoDTO tipo){
		ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
		Map<String, Object> map = ec.getSessionMap();
		map.put("edicionTipo", tipo);
		return "/xhtml/editTipo.xhtml";
	}
	
	public String addPlato(){
		return "/xhtml/editPlato.xhtml";
	}
	
	public String editPlato(PlatoDTO plato){
		ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
		Map<String, Object> map = ec.getSessionMap();
		map.put("edicionPlato", plato);
		return "/xhtml/editPlato.xhtml";
	}
	
	/**
	 * Metodo seleccion de la tabla de categorias.
	 * @param event Evento
	 */
	public void selectionListener(RowSelectorEvent event) { 
		//con esto obtenemos el objeto ( <ice:dataTable> ) de icefaces 
		RowSelector rowSelecte = (RowSelector) event.getComponent(); 
	
		//aqui obtenemos la propiedad del objeto que sabe cual fila es la que esta //...seleccionada. 
		filaSeleccionada = rowSelecte.getClickedRow();
		
		TipoDTO tipo = tipos.get(filaSeleccionada);
		
		List<Plato> platosAux = PlatoLocalServiceUtil.selectPlatosPorTipo(Long.valueOf(tipo.getTipoId()).intValue(), idioma);
		
		platos = new ArrayList<PlatoDTO>();
		
		for (Plato plato : platosAux){
			PlatoDTO platoAux = (PlatoDTO)plato;
			platoAux.setLanguage(idioma);
			cargarImagen(platoAux);
			platos.add(platoAux);
		}
		
	}
	
	private void cargarImagen(PlatoDTO plato){
		try{
			if (plato.getImagen() != 0){
				Image image = ImageLocalServiceUtil.getImage(plato.getImagen());
			
				if (image != null && image.getTextObj() != null){
					byte[] fileContent = image.getTextObj();
					// convert byte array back to BufferedImage
					InputStream in = new ByteArrayInputStream(fileContent);
					BufferedImage bImageFromConvert = ImageIO.read(in);
					
					if (bImageFromConvert != null){
						String imagen = image.getText() + "." + (image.getType() != null && !image.getType().isEmpty() ? image.getType() : "png");
						
						//Creamos la imagen.
						ImageIO.write(bImageFromConvert, (image.getType() != null && !image.getType().isEmpty() ? image.getType() : "png"), new File(url + imagen));
						
						plato.setImageName(pathImage + imagen);
					}
				}
			}
		} catch (SystemException e) {
			_log.error(e.getMessage());
		} catch (PortalException e){
			_log.error(e.getMessage());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}

	public List<PlatoDTO> getPlatos() {
		return platos;
	}

	public void setPlatos(List<PlatoDTO> platos) {
		this.platos = platos;
	}

	public List<TipoDTO> getTipos() {
		return tipos;
	}

	public void setTipos(List<TipoDTO> tipos) {
		this.tipos = tipos;
	}

	public String getPathImage() {
		return pathImage;
	}

	public void setPathImage(String pathImage) {
		this.pathImage = pathImage;
	}

	public boolean isBadministrador() {
		return badministrador;
	}

	public void setBadministrador(boolean badministrador) {
		this.badministrador = badministrador;
	}

}
